home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1999 / MacHack 1999.toast / The Hacks / AltiVec Effect / BltMacros.h < prev    next >
Text File  |  1998-09-28  |  40KB  |  1,252 lines

  1. /*
  2.  
  3.     File:        BltMacros.h
  4.  
  5.     Contains:    Macros to help you handle multiple pixel formats
  6.                 in your effects components
  7.  
  8.     Written by:    Mike Dodd and Giovanni Agnoli
  9.  
  10.     Copyright:    © 1997 by Apple Computer, Inc., all rights reserved.
  11.  
  12. */
  13.  
  14.  
  15. #ifndef __CONDITIONALMACROS__
  16. #include <ConditionalMacros.h>
  17. #endif
  18. #ifndef __MACTYPES__
  19. #include <MacTypes.h>
  20. #endif
  21.  
  22. #include <Endian.h>
  23.  
  24.  
  25. #if PRAGMA_ONCE
  26. #pragma once
  27. #endif
  28.  
  29. #ifdef __cplusplus
  30. extern "C" {
  31. #endif
  32.  
  33. #if PRAGMA_IMPORT
  34. #pragma import on
  35. #endif
  36.  
  37. #if PRAGMA_STRUCT_ALIGN
  38.     #pragma options align=mac68k
  39. #elif PRAGMA_STRUCT_PACKPUSH
  40.     #pragma pack(push, 2)
  41. #elif PRAGMA_STRUCT_PACK
  42.     #pragma pack(2)
  43. #endif
  44.  
  45.  
  46.  
  47. #if TARGET_RT_BIG_ENDIAN
  48.     #define B2NEndianRgnHandle(value)            
  49.     #define N2BEndianRgnHandle(value)            
  50.     #define B2NEndianPixMapHandle(value)        
  51.     #define N2BEndianPixMapHandle(value)        
  52. #endif
  53.  
  54.  
  55. //***** Here are the macros we know so well *****
  56.  
  57.  
  58. // These macros need renaming!  
  59. // Several issues: 
  60. //        swap-in-place vs. function return (eg. MyEndianRect currently is inconsistent with MyEndian16)
  61. //        4 different directions (BigToMine, MineToBig, LittleToMine, MineToLittle)
  62.  
  63. // General macros for swapping unconditionally
  64. #define Swapped16(a)        ((((a)&0xff)<<8) | ((unsigned short)(((a)&0xff00))>>8))
  65. #define SwappedS16(a)        ((short)Swapped16(a))
  66. #define SwappedU16(a)        ((unsigned short)Swapped16(a))
  67. #define Swapped32(a)        ((((a)&0xff)<<24) | (((a)&0xff00)<<8) | ((unsigned long)(((a)&0xff0000))>>8) | ((unsigned long)(((a)&0xff000000))>>24))
  68. #define SwappedS32(a)        ((long)Swapped32(a))
  69. #define SwappedU32(a)        ((unsigned long)Swapped32(a))
  70. #define SwapS16(a)            ((a)=SwappedS16(a))
  71. #define SwapU16(a)            ((a)=SwappedU16(a))
  72. #define SwapS32(a)            ((a)=SwappedS32(a))
  73. #define SwapU32(a)            ((a)=SwappedU32(a))
  74.  
  75.  
  76.  
  77. #define SwapS32Multiple(ptr,cnt) \
  78. {   long *__p = (long *)(ptr); \
  79.     long __i; \
  80.     for (__i=0;__i<(long)(cnt);__i++) {\
  81.         SwapS32(*__p); \
  82.         __p++; \
  83.     } \
  84. }
  85. #define SwapU32Multiple(ptr,cnt) \
  86. {   unsigned long *__p = (unsigned long *)(ptr); \
  87.     long __i; \
  88.     for (__i=0;__i<(long)(cnt);__i++) {\
  89.         SwapU32(*__p); \
  90.         __p++; \
  91.     } \
  92. }
  93. #define SwapS16Multiple(ptr,cnt) \
  94. {   short *__p = (short *)(ptr); \
  95.     long __i; \
  96.     for (__i=0;__i<(long)(cnt);__i++) { \
  97.         SwapS16(*__p); \
  98.         __p++; \
  99.     } \
  100. }
  101. #define SwapU16Multiple(ptr,cnt) \
  102. {   unsigned short *__p = (unsigned short *)(ptr); \
  103.     long __i; \
  104.     for (__i=0;__i<(long)(cnt);__i++) { \
  105.         SwapU16(*__p); \
  106.         __p++; \
  107.     } \
  108. }
  109.  
  110.  
  111.  
  112. #define SwapRect(a)    \
  113.         {    SwapU16((a).top); SwapU16((a).bottom); SwapU16((a).left); SwapU16((a).right); }
  114.             
  115.  
  116. #define SwapMatrix3by3(a)    \
  117.         {    SwapU32(a.matrix[0][0]); SwapU32(a.matrix[0][1]); SwapU32(a.matrix[0][2]);    \
  118.             SwapU32(a.matrix[1][0]); SwapU32(a.matrix[1][1]); SwapU32(a.matrix[1][2]);    \
  119.             SwapU32(a.matrix[2][0]); SwapU32(a.matrix[2][1]); SwapU32(a.matrix[2][2]);    }
  120.  
  121.  
  122.  
  123. #if TARGET_RT_LITTLE_ENDIAN
  124.  
  125. #define L2NEndianS16(a)                
  126. #define L2NEndianU16(a)                
  127.  
  128. #define L2NEndianS32(a)                
  129. #define L2NEndianU32(a)                
  130.  
  131. #define B2NEndianS16(a)                SwapS16(a)
  132. #define B2NEndianU16(a)                SwapU16(a)
  133.  
  134. #define B2NEndianS32(a)                SwapS32(a)
  135. #define B2NEndianU32(a)                SwapU32(a)
  136.  
  137. #define N2BEndianS32    B2NEndianS32
  138. #define N2BEndianU32    B2NEndianU32
  139.  
  140. #define N2LEndianS32    L2NEndianS32
  141. #define N2LEndianU32    L2NEndianU32
  142.  
  143. #define N2BEndianS16    B2NEndianS16
  144. #define N2BEndianU16    B2NEndianU16
  145.  
  146. #define N2LEndianS16    L2NEndianS16
  147. #define N2LEndianU16    L2NEndianU16
  148.  
  149. #define L2NEndianS16Multiple(a,b)
  150. #define L2NEndianU16Multiple(a,b)
  151.  
  152. #define L2NEndianS32Multiple(a,b)
  153. #define L2NEndianU32Multiple(a,b)
  154.  
  155. #define B2NEndianS16Multiple(a,b)    SwapS16Multiple(a,b)
  156. #define B2NEndianU16Multiple(a,b)    SwapU16Multiple(a,b)
  157.  
  158. #define B2NEndianS32Multiple(a,b)    SwapS32Multiple(a,b)    
  159. #define B2NEndianU32Multiple(a,b)    SwapU32Multiple(a,b)    
  160.  
  161. #define N2BEndianMatrix3by3(a)    SwapMatrix3by3(a)
  162. #define B2NEndianMatrix3by3(a)    SwapMatrix3by3(a)
  163. #define N2LEndianMatrix3by3(a)
  164. #define L2NEndianMatrix3by3(a)
  165.  
  166. #define N2BEndianRect(a)    SwapRect(a)             
  167. #define B2NEndianRect(a)    SwapRect(a)
  168. #define N2LEndianRect(a)
  169. #define L2NEndianRect(a)             
  170.  
  171.  
  172.  
  173. #else
  174.  
  175. #define L2NEndianS16(a)                SwapS16(a)
  176. #define L2NEndianU16(a)                SwapU16(a)
  177.  
  178. #define L2NEndianS32(a)                SwapS32(a)
  179. #define L2NEndianU32(a)                SwapU32(a)
  180.  
  181. #define B2NEndianS16(a)                
  182. #define B2NEndianU16(a)                
  183.  
  184. #define B2NEndianS32(a)                
  185. #define B2NEndianU32(a)                
  186.  
  187. #define N2BEndianS32    B2NEndianS32
  188. #define N2BEndianU32    B2NEndianU32
  189.  
  190. #define N2LEndianS32    L2NEndianS32
  191. #define N2LEndianU32    L2NEndianU32
  192.  
  193. #define N2BEndianS16    B2NEndianS16
  194. #define N2BEndianU16    B2NEndianU16
  195.  
  196. #define N2LEndianS16    L2NEndianS16
  197. #define N2LEndianU16    L2NEndianU16
  198.  
  199. #define L2NEndianS16Multiple(a,b)    SwapS16Multiple(a,b)
  200. #define L2NEndianU16Multiple(a,b)    SwapU16Multiple(a,b)
  201.  
  202. #define L2NEndianS32Multiple(a,b)    SwapS32Multiple(a,b)    
  203. #define L2NEndianU32Multiple(a,b)    SwapU32Multiple(a,b)    
  204.  
  205. #define B2NEndianS16Multiple(a,b)
  206. #define B2NEndianU16Multiple(a,b)
  207.  
  208. #define B2NEndianS32Multiple(a,b)
  209. #define B2NEndianU32Multiple(a,b)
  210.  
  211. #define N2BEndianMatrix3by3(a)
  212. #define B2NEndianMatrix3by3(a)
  213. #define N2LEndianMatrix3by3(a)    SwapMatrix3by3(a)
  214. #define L2NEndianMatrix3by3(a)    SwapMatrix3by3(a)
  215.  
  216. #define N2BEndianRect(a)                
  217. #define B2NEndianRect(a)
  218. #define N2LEndianRect(a)    SwapRect(a) 
  219. #define L2NEndianRect(a)    SwapRect(a)
  220.  
  221. #endif
  222.  
  223.  
  224. // Macros that take big-endian data, and swap it to native (my) format.
  225. #if TARGET_RT_LITTLE_ENDIAN
  226.  
  227.  
  228.  
  229.     #define MyEndian16(a)        SwappedU16(a)
  230.     #define MyEndian32(a)        SwappedU32(a)
  231.     #define MyEndianS16(a)        SwappedS16(a)
  232.     #define MyEndianS32(a)        SwappedS32(a)
  233.  
  234.     #define MyEndianRect(a)        SwapRect(a)    
  235.  
  236.     #define MyEndianPoint(a)    SwapU16((a).v);   SwapU16((a).h)
  237.     #define MyEndianRGBColor(a) SwapU16((a).red); SwapU16((a).green);  SwapU16((a).blue); 
  238.  
  239.     #define MyEndian16Multiple(p, num) SwapU16Multiple(p,num)
  240.     #define MyEndian32Multiple(p, num) SwapU32Multiple(p,num)
  241.  
  242.     #define MyEndianQTFloatDouble(a)    *(UInt64*)&a = Endian64_Swap(*(UInt64*)&a)
  243.     #define MyEndianQTFloatSingle(a)    *(UInt32*)&a = Endian32_Swap(*(UInt32*)&a)
  244.  
  245. #else
  246.     #define MyEndian16(a)        (a)
  247.     #define MyEndian32(a)        (a)
  248.     #define MyEndianS16(a)        (a)
  249.     #define MyEndianS32(a)        (a)
  250.  
  251.     #define MyEndianRect(a)                
  252.              
  253.     #define MyEndianPoint(a)    
  254.     #define MyEndianRGBColor(a)
  255.  
  256.     #define MyEndian16Multiple(p,num)
  257.     #define MyEndian32Multiple(p,num)
  258.  
  259.     #define MyEndianQTFloatDouble(a)
  260.     #define MyEndianQTFloatSingle(a)
  261. #endif
  262.  
  263.  
  264.  
  265. // Macros that take native expressions, and swap the result 
  266. // to the specified endian-ness.
  267. #if TARGET_RT_LITTLE_ENDIAN
  268.     #define LittleEndian16(a) (a)
  269.     #define LittleEndian32(a) (a)
  270.     #define BigEndian16(a) SwappedU16(a)
  271.     #define BigEndian32(a) SwappedU32(a)
  272.     
  273.     #define MyEndianFromLittle16(a) (a)
  274.     #define MyEndianFromLittle32(a) (a)
  275. #else
  276.     #define LittleEndian16(a) SwappedU16(a)
  277.     #define LittleEndian32(a) SwappedU32(a)
  278.     #define BigEndian16(a) (a)
  279.     #define BigEndian32(a) (a)
  280.     
  281.     #define MyEndianFromLittle16(a) SwappedU16(a)
  282.     #define MyEndianFromLittle32(a) SwappedU32(a)
  283. #endif
  284.  
  285.  
  286.  
  287. // Handy stream macros - reads and writes longs and shorts aligned and misaligned
  288.  
  289. // this was TARGET_OS_WIN32, but NeXTIntel wants this
  290. #if TARGET_RT_LITTLE_ENDIAN
  291. #define Get32(x)        (*(long*)(x))
  292. #define GetU32(x)        (*(unsigned long*)(x))
  293. #define Set32(x,y)        (*(long*)(x)) = ((long)(y))
  294.  
  295. #define Get16(x)        (*(short*)(x))
  296. #define GetU16(x)        (*(unsigned short*)(x))
  297. #define Set16(x,y)        (*(short*)(x)) = ((short)(y))
  298.  
  299. #define Get32E(x)        SwappedS32(*(unsigned long*)(x))
  300.  
  301. #define GetU32E(x)        SwappedU32(*(unsigned long*)(x))
  302.  
  303. #define Set32E(x,y)        { unsigned long z_z_val = y; *(unsigned long*)(x)=SwappedU32(z_z_val); }
  304.  
  305. #define Get16E(x)        SwappedS16(*(unsigned short*)(x))
  306.  
  307. #define GetU16E(x)        SwappedU16(*(unsigned short*)(x))
  308.  
  309. #define Set16E(x,y)        { unsigned short z_z_val = y; *(unsigned short*)(x)=SwappedU16(z_z_val); }
  310.  
  311. #define ABGRFLIP(zzz)
  312.  
  313.  
  314. #elif TARGET_OS_UNIX
  315.  
  316. #if TARGET_CPU_PPC
  317. #define GetU32(x)    (*(unsigned long*)(x))
  318. #define Get32(x)    (*(long*)(x))
  319. #define Set32(x,y)    (*(unsigned long*)(x) = (unsigned long)(y))
  320. #define Get16(x)    (*(short*)(x))
  321. #define GetU16(x)    (*(unsigned short*)(x))
  322. #define Set16(x,y)    (*(unsigned short*)(x) = (unsigned short)(y))
  323.  
  324.  
  325.  
  326. #else /* risc based - gonna buserr if we access misaligned data */
  327.  
  328. #define GetU32(x) (unsigned long) (            \
  329.         (((unsigned char*)(x))[0] << 24) |    \
  330.         (((unsigned char*)(x))[1] << 16) |    \
  331.         (((unsigned char*)(x))[2] << 8)  |    \
  332.         (((unsigned char*)(x))[3]) )
  333.  
  334. #define Get32(x) (long) (            \
  335.         (((unsigned char*)(x))[0] << 24) |    \
  336.         (((unsigned char*)(x))[1] << 16) |    \
  337.         (((unsigned char*)(x))[2] << 8)  |    \
  338.         (((unsigned char*)(x))[3]) )
  339.  
  340. #define Set32(x,y) { unsigned long z_z_val = y; \
  341.         ((unsigned char*)(x))[0] = (z_z_val & 0xff000000) >> 24;                \
  342.         ((unsigned char*)(x))[1] = (z_z_val & 0x00ff0000) >> 16;                \
  343.         ((unsigned char*)(x))[2] = (z_z_val & 0x0000ff00) >> 8;                 \
  344.         ((unsigned char*)(x))[3] = (z_z_val & 0x000000ff);        }             \
  345.         
  346. #define Get16(x)    (short)    (    \
  347.         (((unsigned char*)(x))[0] << 8)  |    \
  348.         (((unsigned char*)(x))[1]) )
  349.  
  350. #define GetU16(x)    (unsigned short)    (    \
  351.         (((unsigned char*)(x))[0] << 8)  |    \
  352.         (((unsigned char*)(x))[1]) )
  353.  
  354. #define Set16(x,y) { unsigned long z_z_val = y; \
  355.         ((unsigned char*)(x))[0] = (z_z_val & 0xff00) >> 8;                 \
  356.         ((unsigned char*)(x))[1] = (z_z_val & 0x00ff);        }             \
  357.  
  358. #endif     /* non-ppc risc UNIX */
  359.  
  360. #define Get32E    Get32
  361. #define GetU32E    GetU32
  362. #define Set32E    Set32
  363.  
  364. #define Get16E    Get16
  365. #define GetU16E    GetU16
  366. #define Set16E    Set16
  367.  
  368. #define ABGRFLIP(zzz) { long zzzpix = zzz; zzz = zzz & 0xff00ff00;    \
  369.                         zzz |= ((zzzpix & 0x00ff0000) >> 16);        \
  370.                         zzz |= ((zzzpix & 0x000000ff) << 16); }
  371.  
  372.  
  373.  
  374. #else        /* not little-endian, not UNIX, must be MacOS - big endian */
  375.  
  376. #define Get32(x)        (*(long*)(x))
  377. #define GetU32(x)        (*(unsigned long*)(x))
  378. #define Set32(x,y)        (*(long*)(x)) = ((long)(y))
  379.  
  380. #define Get16(x)        (*(short*)(x))
  381. #define GetU16(x)        (*(unsigned short*)(x))
  382. #define Set16(x,y)        (*(short*)(x)) = ((short)(y))
  383.  
  384. #define Get32E    Get32
  385. #define GetU32E    GetU32
  386. #define Set32E    Set32
  387.  
  388. #define Get16E    Get16
  389. #define GetU16E    GetU16
  390. #define Set16E    Set16
  391.  
  392. #define ABGRFLIP(zzz)
  393.  
  394. #endif
  395.  
  396. long    FlipLongPtr        (long*);
  397. long    FlipShortPtr       (short*);
  398. void    FlipE80            (void *);
  399. void    FlipArray          (void *,long,short);
  400.  
  401.  
  402.  
  403. #if !TARGET_OS_MAC && TARGET_RT_LITTLE_ENDIAN
  404. #ifndef RgnHandle
  405.     #include <Quickdraw.h>
  406. #endif
  407. void B2NEndianRgnHandle(RgnHandle theRgn);
  408. void N2BEndianRgnHandle(RgnHandle theRgn);
  409. void B2NEndianPixMapHandle(PixMapHandle thePixMap);
  410. void N2BEndianPixMapHandle(PixMapHandle thePixMap);
  411. #endif
  412.  
  413.  
  414.  
  415. /*
  416.     Conversion macros for BigEndian always types (QuickTimeMusic.h)
  417. */
  418. #define GetNativeLongFrom(p)                (long)Get32E(p)
  419. #define GetNativeShortFrom(p)                (short)Get16E(p)
  420. #define GetNativeFixedFrom(p)                (Fixed)Get32E(p)
  421. #define GetNativeUnsignedFixedFrom(p)        (UnsignedFixed)Get32E(p)
  422. #define GetNativeOSTypeFrom(p)                (OSType)Get32E(p)
  423. #define SetBigEndianLongAt(p, val)            Set32E(p, val)
  424. #define SetBigEndianShortAt(p, val)            Set16E(p, val)
  425. #define SetBigEndianFixedAt(p, val)            Set32E(p, val)
  426. #define SetBigEndianUnsignedFixedAt(p, val)    Set32E(p, val)
  427. #define SetBigEndianOSTypeAt(p, val)        Set32E(p, val)
  428.  
  429.  
  430.  
  431. #if PRAGMA_STRUCT_ALIGN
  432.     #pragma options align=reset
  433. #elif PRAGMA_STRUCT_PACKPUSH
  434.     #pragma pack(pop)
  435. #elif PRAGMA_STRUCT_PACK
  436.     #pragma pack()
  437. #endif
  438.  
  439. #ifdef PRAGMA_IMPORT_OFF
  440. #pragma import off
  441. #elif PRAGMA_IMPORT
  442. #pragma import reset
  443. #endif
  444.  
  445. #ifdef __cplusplus
  446. }
  447. #endif
  448.  
  449. // DNC: End EndianPriv.h
  450.  
  451. // DNC: Start BltTrans.h
  452.  
  453. #define from32wxyzto32xyzw(a)        a = ((((a)&0xffffff)<<8) | ((((unsigned long)(a))&0xff000000)>>24))
  454. #define from32wxyzto32wzyx(a)        a = ((((a)&0xff)<<16) | (((a)&0xff0000)>>16) | ((((unsigned long)(a))&0xff00ff00)))
  455. #define from32wxyzto32yxwz(a)        a = ((((a)&0xff00)<<16) | (((a)&0xff000000)>>16) | ((((unsigned long)(a))&0xff00ff)))
  456. #define from32wxyzto32zwxy(a)        a = ((((a)&0xffffff00)>>8) | ((((unsigned long)(a))&0xff)<<24))
  457. #define from32wxyzto32xwzy(a)        a = ((((a)&0xff00ff00)>>8) | ((((unsigned long)(a))&0x00ff00ff)<<8))
  458. #define from32wxyzto32zyxw(a)        a = ((((a)&0xff)<<24) | (((a)&0xff00)<<8) | (((a)&0xff0000)>>8) | ((((unsigned long)(a))&0xff000000)>>24))
  459. #define from32wxyzto32yzwx(a)        a = ((((a)&0xffff0000)>>16) | ((((unsigned long)(a))&0x0000ffff)<<16))
  460.  
  461. #define from32wxyzto32wxy_(a)        a = ((unsigned long)(a) & 0xffffff00)
  462. #define from32wxyzto32_xyz(a)        a = ((unsigned long)(a) & 0x00ffffff)
  463. #define from32wxyzto32_yxw(a)        a = ((((a)&0xff00)<<8) | (((a)&0xff0000)>>8) | ((((unsigned long)(a))&0xff000000)>>24))
  464. #define from32wxyzto32zyx_(a)        a = ((((a)&0xff)<<24) | (((a)&0xff00)<<8) | ((((unsigned long)(a))&0xff0000)>>8))
  465. #define from32wxyzto32yxw_(a)        a = ((((a)&0xff00)<<16) | (((a)&0xff000000)>>16) | ((((unsigned long)(a))&0xff0000))) 
  466. #define from32wxyzto32_zyx(a)        a = ((((a)&0xff)<<16) | (((a)&0xff0000)>>16) | ((((unsigned long)(a))&0x0000ff00)))
  467. #define from32wxyzto32_wxy(a)        a = (((((unsigned long)(a))&0xffffff00)>>8))
  468. #define from32wxyzto32xyz_(a)        a = (((((unsigned long)(a))&0xffffff)<<8))
  469.  
  470. #define from32ARGBto32ABGR(a)        from32wxyzto32wzyx(a)
  471. #define from32ARGBto32BGRA(a)        from32wxyzto32zyxw(a)
  472. #define from32ARGBto32RGBA(a)        from32wxyzto32xyzw(a)
  473.  
  474. #define from32ABGRto32ARGB(a)        from32wxyzto32wzyx(a)
  475. #define from32ABGRto32BGRA(a)        from32wxyzto32xyzw(a)
  476. #define from32ABGRto32RGBA(a)        from32wxyzto32zyxw(a)
  477.  
  478. #define from32BGRAto32ARGB(a)        from32wxyzto32zyxw(a)
  479. #define from32BGRAto32ABGR(a)        from32wxyzto32zwxy(a)
  480. #define from32BGRAto32RGBA(a)        from32wxyzto32yxwz(a)
  481.  
  482. #define from32RGBAto32ARGB(a)        from32wxyzto32zwxy(a)
  483. #define from32RGBAto32ABGR(a)        from32wxyzto32zyxw(a)
  484. #define from32RGBAto32BGRA(a)        from32wxyzto32yxwz(a)
  485.  
  486. // 16 bit
  487. #define fromBERGBx2toLERGBx2(a)        from32wxyzto32xwzy(a)
  488. #define fromBERGBx2toLE565x2(a)        a = ((((a)&0x007f007f)<<9) | (((a)&0x3f003f00)>>8) | ((((unsigned long)(a))&0xe000e000)>>7))
  489.  
  490. #define fromLERGBx2toBERGBx2(a)        from32wxyzto32xwzy(a)
  491. #define fromLERGBx2toLE565x2(a)        a = ((((a)&0x007f007f)<<1) | (((a)&0x80008000)>>15) | (((a)&0x60006000)<<1) | ((((unsigned long)(a))&0x3f003f00)))    
  492.  
  493. #define fromLE565x2toLERGBx2(a)        a = ((((a)&0x1f001f00)) | (((a)&0xc0fec0fe)>>1) | ((((unsigned long)(a))&0x00010001)<<15))    
  494. #define fromLE565x2toBERGBx2(a)        a = ((((a)&0x00ff00ff)<<7) | (((a)&0x1f001f00)>>8) | ((((unsigned long)(a))&0xc000c000)>>9))    
  495.  
  496.  
  497. // DNC: End BltTrans.h
  498.  
  499. #define TempAllowDebugCalls    1
  500.  
  501. #define Flip24(data) { \
  502.     data = ( ( ( data & 0x0000ff ) << 16 ) | ( ( data & 0xff0000 ) >> 16 ) | ( data & 0x00ff00 ) ); \
  503. }
  504.  
  505. #define Set24(dst,data) { \
  506.     *(unsigned char *)(dst) = (data & 0xff0000) >> 16; \
  507.     *((unsigned char *)(dst)+1) = (data & 0xff00) >> 8; \
  508.     *((unsigned char *)(dst)+2) = data & 0xff; \
  509. }
  510.  
  511. #define Get24(src)        ( ( ((unsigned long)(((unsigned char *)src)[0])) << 16    ) + \
  512.                           ( ((unsigned long)(((unsigned char *)src)[1])) << 8    ) + \
  513.                             ((unsigned long)(((unsigned char *)src)[2]))        )
  514.  
  515. #undef cnv16Nto16DPF
  516. #if dstIs16BE555                                        // don't flip in either case
  517. #define cnv16Nto16DPF(a)        
  518. #elif dstIs16LE555                                    // flip in both cases
  519. #define cnv16Nto16DPF(a)        SwapU16(a)
  520. #elif dstIs16LE565                //            r+g1                g2n+b                                g2
  521. #define cnv16Nto16DPF(a)        a = ((((a)&0x007f)<<9) | (((a)&0x3f00)>>8) | (((unsigned short)(a)&0xe000)>>7))
  522. #else
  523.     #if TempAllowDebugCalls
  524.         #define cnv16Nto16DPF(a)        DebugStr("\pcnv16Nto16DPF")
  525.     #else
  526.         #error "cnv16Nto16DPF(a) not defined for this case in BltMacros.h";
  527.     #endif
  528. #endif
  529.  
  530. #undef cnv16RGto16DPF
  531. #if dstIs16BE555
  532. #define cnv16RGto16DPF(a)    N2BEndianU16(a)
  533. #elif dstIs16LE555
  534. #define cnv16RGto16DPF(a)    N2LEndianU16(a)    
  535. #elif dstIs16LE565                //            r+g1+g2                                g2n+b
  536. #define cnv16RGto16DPF(a)    a = ((((a)&0x7fe0)<<1) | ((((unsigned short)(a))&0x003f)) )
  537. #else
  538.     #if TempAllowDebugCalls
  539.         #define cnv16RGto16DPF(a)    DebugStr("\pcnv16RGto16DPF")
  540.     #else
  541.         #error "cnv16RGto16DPF(a) not defined for this case in BltMacros.h";
  542.     #endif
  543. #endif
  544.  
  545. #undef cnv16DPFto16RG
  546. #if dstIs16BE555
  547. #define cnv16DPFto16RG(a)    B2NEndianU16(a)
  548. #elif dstIs16LE555
  549. #define cnv16DPFto16RG(a)    L2NEndianU16(a)    
  550. #elif dstIs16LE565 & TARGET_RT_LITTLE_ENDIAN                //            r+g1+g2                                g2n+b
  551. #define cnv16DPFto16RG(a)    a = ((((a)&0xffc0)>>1) | ((((unsigned short)(a))&0x001f)) )
  552. #else
  553.     #if TempAllowDebugCalls
  554.         #define cnv16DPFto16RG(a)    DebugStr("\pcnv16DPFto16RG")
  555.     #else
  556.         #error "cnv16DPFto16RG(a) not defined for this case in BltMacros.h";
  557.     #endif
  558. #endif
  559.  
  560. #undef cnv16Nx2to16DPFx2
  561. #if dstIs16BE555                                        // don't flip in either case
  562. #define cnv16Nx2to16DPFx2(a)        
  563. #elif dstIs16LE555 & TARGET_RT_LITTLE_ENDIAN
  564. #define cnv16Nx2to16DPFx2(a)        from32wxyzto32xwzy(a)
  565. #elif dstIs16LE555 & !TARGET_RT_LITTLE_ENDIAN
  566. #define cnv16Nx2to16DPFx2(a)        from32wxyzto32yzwx(a)
  567. #elif dstIs16LE565                    //            r+g1                    g2n+b                                    g2                                    g2->g1
  568. #define cnv16Nx2to16DPFx2(a)        a = ((((a)&0x007f007f)<<9) | (((a)&0x3f003f00)>>8) | ((((unsigned long)(a))&0xe000e000)>>7))
  569. #else
  570.     #if TempAllowDebugCalls
  571.         #define cnv16Nx2to16DPFx2(a)        DebugStr("\pcnv16Nx2to16DPFx2")
  572.     #else
  573.         #error "cnv16Nx2to16DPFx2(a) not defined for this case in BltMacros.h";
  574.     #endif
  575. #endif
  576.  
  577. #undef cnv16RGx2to16DPFx2
  578. #if dstIs16BE555
  579. #define cnv16RGx2to16DPFx2(a)        N2BEndianU32(a)
  580. #elif dstIs16LE555 & TARGET_RT_LITTLE_ENDIAN
  581. #define cnv16RGx2to16DPFx2(a)        from32wxyzto32yzwx(a)
  582. #elif dstIs16LE555 & !TARGET_RT_LITTLE_ENDIAN
  583. #define cnv16RGx2to16DPFx2(a)        DebugStr("\pcnv16RGx2to16DPFx2")
  584. #elif dstIs16LE565                    //            r+g1+g2                    g2n+b                            r2+g3+g4                    g4n+b2                                    g2                                    
  585. #define cnv16RGx2to16DPFx2(a)        a = ((((a)&0x7fe00000)>>15) | (((a)&0x003f0000)>>16) | (((a)&0x00007fe0)<<17) | ((((unsigned long)(a))&0x0000003f)<<16))
  586. #else
  587.     #if TempAllowDebugCalls
  588.         #define cnv16RGx2to16DPFx2(a)        DebugStr("\pcnv16rGx2to16DPFx2")
  589.     #else
  590.         #error "cnv16RGx2to16DPFx2(a) not defined for this case in BltMacros.h";
  591.     #endif
  592. #endif
  593.  
  594. #undef cnv16DPFx2to16RGx2
  595. #if dstIs16BE555
  596. #define cnv16DPFx2to16RGx2(a)        B2NEndianU32(a)
  597. #elif dstIs16LE555 & TARGET_RT_LITTLE_ENDIAN
  598. #define cnv16DPFx2to16RGx2(a)        from32wxyzto32yzwx(a)
  599. #elif dstIs16LE555 & !TARGET_RT_LITTLE_ENDIAN
  600. #define cnv16DPFx2to16RGx2(a)        from32wxyzto32xwzy(a)
  601. #elif dstIs16LE565                    //            r+g1+g2                    g2n+b                            r2+g3+g4                    g4n+b2                                    g2                                    
  602. #define cnv16DPFx2to16RGx2(a)        a = ((((a)&0xffc00000)>>17) | (((a)&0x001f0000)>>16) | (((a)&0x0000ffc0)<<15) | ((((unsigned long)(a))&0x0000001f)<<16))
  603. #else
  604.     #if TempAllowDebugCalls
  605.         #define cnv16DPFx2to16RGx2(a)        DebugStr("\pcnv16DPFx2to16RGx2")
  606.     #else
  607.         #error "cnv16DPFx2to16RGx2(a) not defined for this case in BltMacros.h";
  608.     #endif
  609. #endif
  610.  
  611. #undef cnv16SPFx2to16RGx2
  612. #if srcIs16BE555
  613. #define cnv16SPFx2to16RGx2(a)        B2NEndianU32(a)
  614. #elif srcIs16LE555 & TARGET_RT_LITTLE_ENDIAN
  615. #define cnv16SPFx2to16RGx2(a)        from32wxyzto32yzwx(a)
  616. #elif srcIs16LE555 & !TARGET_RT_LITTLE_ENDIAN
  617. #define cnv16SPFx2to16RGx2(a)        from32wxyzto32xwzy(a)
  618. #elif srcIs16LE565                    //            r+g1+g2                    g2n+b                            r2+g3+g4                    g4n+b2                                    g2                                    
  619. #define cnv16SPFx2to16RGx2(a)        a = ((((a)&0xffc00000)>>17) | (((a)&0x001f0000)>>16) | (((a)&0x0000ffc0)<<15) | ((((unsigned long)(a))&0x0000001f)<<16))
  620. #else
  621.     #if TempAllowDebugCalls
  622.         #define cnv16SPFx2to16RGx2(a)        DebugStr("\pcnv16SPFx2to16RGx2")
  623.     #else
  624.         #error "cnv16SPFx2to16RGx2(a) not defined for this case in BltMacros.h";
  625.     #endif
  626. #endif
  627.  
  628. // converts 32bit argb to selected pixel format
  629. #undef cnv32ARto32PF
  630. #define cnv32ARto32PF cnv32ARto32DPF
  631. #undef cnv32ARto32DPF
  632. #if dstIs32ARGB
  633. #define cnv32ARto32DPF(a)        N2BEndianU32(a)
  634. #elif dstIs32BGRA
  635. #define cnv32ARto32DPF(a)        N2LEndianU32(a)
  636. #elif dstIs32ABGR && TARGET_RT_LITTLE_ENDIAN
  637. #define cnv32ARto32DPF(a)        from32wxyzto32xyzw(a)
  638. #elif dstIs32ABGR && !TARGET_RT_LITTLE_ENDIAN
  639. #define cnv32ARto32DPF(a)        from32wxyzto32wzyx(a)
  640. #elif dstIs32RGBA && TARGET_RT_LITTLE_ENDIAN
  641. #define cnv32ARto32DPF(a)        from32wxyzto32wzyx(a)
  642. #elif dstIs32RGBA && !TARGET_RT_LITTLE_ENDIAN
  643. #define cnv32ARto32DPF(a)        from32wxyzto32xyzw(a)
  644. #else
  645.     #if TempAllowDebugCalls
  646.         #define cnv32ARto32DPF(a)        DebugStr("\pcnv32ARto32DPF")
  647.     #else
  648.         #error "cnv32ARto32DPF(a) not defined for this case in BltMacros.h";
  649.     #endif
  650. #endif
  651.  
  652. // converts 32bit argb to selected pixel format
  653.  
  654. #undef cnv32PFto32AR
  655. #define cnv32PFto32AR cnv32DPFto32AR                // for compatibility
  656. #undef cnv32DPFto32AR
  657. #if dstIs32ARGB
  658. #define cnv32DPFto32AR(a)        B2NEndianU32(a)
  659. #elif dstIs32BGRA
  660. #define cnv32DPFto32AR(a)        L2NEndianU32(a)
  661. #elif dstIs32ABGR && TARGET_RT_LITTLE_ENDIAN
  662. #define cnv32DPFto32AR(a)        from32wxyzto32zwxy(a)
  663. #elif dstIs32ABGR && !TARGET_RT_LITTLE_ENDIAN
  664. #define cnv32DPFto32AR(a)        from32wxyzto32wzyx(a)
  665. #elif dstIs32RGBA && TARGET_RT_LITTLE_ENDIAN
  666. #define cnv32DPFto32AR(a)        from32wxyzto32wzyx(a)
  667. #elif dstIs32RGBA && !TARGET_RT_LITTLE_ENDIAN
  668. #define cnv32DPFto32AR(a)        from32wxyzto32zwxy(a)
  669. #else
  670.     #if TempAllowDebugCalls
  671.         #define cnv32DPFto32AR(a)        DebugStr("\pcnv32DPFto32AR")
  672.     #else
  673.         #error "cnv32DPFto32AR(a) not defined for this case in BltMacros.h";
  674.     #endif
  675. #endif
  676.  
  677. // converts argb(BE)/bgra(LE) to to selected pixel format
  678. #undef cnv32Nto32PF
  679. #if dstIs32ARGB
  680. #define cnv32Nto32PF(a)        
  681. #elif dstIs32BGRA
  682. #define cnv32Nto32PF(a)        from32wxyzto32zyxw(a)
  683. #elif dstIs32ABGR && TARGET_RT_LITTLE_ENDIAN
  684. #define cnv32Nto32PF(a)        from32wxyzto32yxwz(a)
  685. #elif dstIs32ABGR && !TARGET_RT_LITTLE_ENDIAN
  686. #define cnv32Nto32PF(a)        from32wxyzto32wzyx(a)
  687. #elif dstIs32RGBA && TARGET_RT_LITTLE_ENDIAN
  688. #define cnv32Nto32PF(a)        from32wxyzto32zwxy(a)
  689. #elif dstIs32RGBA && !TARGET_RT_LITTLE_ENDIAN
  690. #define cnv32Nto32PF(a)        from32wxyzto32xyzw(a)
  691. #else
  692.     #if TempAllowDebugCalls
  693.         #define cnv32Nto32PF(a)        DebugStr("\pcnv32Nto32PF")
  694.     #else
  695.         #error "cnv32Nto32PF(a) not defined for this case in BltMacros.h";
  696.     #endif
  697. #endif
  698.  
  699. // converts _rgb(BE)/bgr_(LE) to to selected pixel format
  700. #undef cnv24Nto32PF
  701. #if dstIs32ARGB && TARGET_RT_LITTLE_ENDIAN
  702. #define cnv24Nto32PF(a)        from32wxyzto32wxy_(a)
  703. #elif dstIs32ARGB && !TARGET_RT_LITTLE_ENDIAN
  704. #define cnv24Nto32PF(a)        from32wxyzto32_xyz(a)
  705. #elif dstIs32BGRA && TARGET_RT_LITTLE_ENDIAN                
  706. #define cnv24Nto32PF(a)        from32wxyzto32_yxw(a)
  707. #elif dstIs32BGRA && !TARGET_RT_LITTLE_ENDIAN                
  708. #define cnv24Nto32PF(a)        from32wxyzto32zyx_(a)
  709. #elif dstIs32ABGR && TARGET_RT_LITTLE_ENDIAN
  710. #define cnv24Nto32PF(a)        from32wxyzto32yxw_(a)
  711. #elif dstIs32ABGR && !TARGET_RT_LITTLE_ENDIAN
  712. #define cnv24Nto32PF(a)        from32wxyzto32_zyx(a)
  713. #elif dstIs32RGBA && TARGET_RT_LITTLE_ENDIAN
  714. #define cnv24Nto32PF(a)        from32wxyzto32_wxy(a)
  715. #elif dstIs32RGBA && !TARGET_RT_LITTLE_ENDIAN
  716. #define cnv24Nto32PF(a)        from32wxyzto32xyz_(a)
  717. #else
  718.     #if TempAllowDebugCalls
  719.         #define cnv24Nto32PF(a)        DebugStr("\pcnv24Nto32PF")
  720.     #else
  721.         #error "cnv24Nto32PF(a) not defined for this case in BltMacros.h";
  722.     #endif
  723. #endif
  724.  
  725. // Transfer long from ARGB to selected pixel format
  726. #undef T32Nto32PF
  727. #if dstIs32ARGB || dstIs32BGRA || dstIs32ABGR || dstIs32RGBA
  728. #define T32Nto32PF(src,dst) { unsigned long temp = GetU32(src); cnv32Nto32PF(temp); Set32(dst,temp); }
  729. #else
  730.     #if TempAllowDebugCalls
  731.         #define T32Nto32PF(src,dst) \
  732.             DebugStr("\pT32Nto32PF")
  733.     #else
  734.         #error "T32Nto32PF(src,dst) not defined for this case in BltMacros.h";
  735.     #endif
  736. #endif
  737.  
  738. // Transfer long from ARGB to selected pixel format, post increment pointers
  739. #undef T32NIto32PFI
  740. #if dstIs32ARGB || dstIs32BGRA || dstIs32ABGR || dstIs32RGBA
  741. #define T32NIto32PFI(src,dst) { unsigned long temp = GetU32(src); cnv32Nto32PF(temp); Set32(dst,temp); dst++; src++;}
  742. #else
  743.     #if TempAllowDebugCalls
  744.         #define T32NIto32PFI(src,dst) \
  745.             DebugStr("\pT32NIto32PFI")
  746.     #else
  747.         #error "T32NIto32PFI(src,dst) not defined for this case in BltMacros.h";
  748.     #endif
  749. #endif
  750.  
  751. // Set long, convert ARGB to selected pixel format
  752. #undef Set32ARtoPF
  753. #if dstIs32ARGB || dstIs32BGRA || dstIs32ABGR || dstIs32RGBA
  754. #define Set32ARtoPF(dst,dstdata) \
  755. { \
  756.     unsigned long temp = dstdata; \
  757.     cnv32ARto32PF(temp); \
  758.     Set32(dst,temp); \
  759. }
  760. #else
  761.     #if TempAllowDebugCalls
  762.         #define Set32ARtoPF(dst,dstdata) \
  763.             DebugStr("\pSet32ARtoPF")
  764.     #else
  765.         #error "Set32ARtoPF(dst,dstdata) not defined for this case in BltMacros.h";
  766.     #endif
  767. #endif
  768.  
  769.  
  770. // converts 32 src pixel format to 32 dst pixel format, assumes src and dst will be read and written using Get32 and Set32
  771. #undef cnv32SPFto32DPF
  772. #if srcIs32ARGB
  773.     #if TARGET_RT_LITTLE_ENDIAN
  774.         #if dstIs32ARGB
  775.             #define cnv32SPFto32DPF(a)
  776.         #elif dstIs32BGRA
  777.             #define cnv32SPFto32DPF(a)        SwapU32(a)
  778.         #elif dstIs32ABGR
  779.             #define cnv32SPFto32DPF(a)        from32wxyzto32yxwz(a)
  780.         #elif dstIs32RGBA
  781.             #define cnv32SPFto32DPF(a)        from32wxyzto32zwxy(a)
  782.         #else
  783.             #if TempAllowDebugCalls
  784.                 #define cnv32SPFto32DPF(a)    DebugStr("\pcnv32SPFto32DPF")
  785.             #else
  786.                 #error "cnv32SPFto32DPF(a) not defined for this case in BltMacros.h";
  787.             #endif
  788.         #endif
  789.     #else            // BIG_ENDIAN
  790.         #if dstIs32ARGB
  791.             #define cnv32SPFto32DPF(a)
  792.         #elif dstIs32BGRA
  793.             #define cnv32SPFto32DPF(a)        SwapU32(a)
  794.         #elif dstIs32ABGR
  795.             #define cnv32SPFto32DPF(a)        from32wxyzto32wzyx(a)
  796.         #elif dstIs32RGBA
  797.             #define cnv32SPFto32DPF(a)        from32wxyzto32xyzw(a)
  798.         #else
  799.             #if TempAllowDebugCalls
  800.                 #define cnv32SPFto32DPF(a)    DebugStr("\pcnv32SPFto32DPF")
  801.             #else
  802.                 #error "cnv32SPFto32DPF(a) not defined for this case in BltMacros.h";
  803.             #endif
  804.         #endif
  805.     #endif
  806. #elif srcIs32BGRA
  807.     #if TARGET_RT_LITTLE_ENDIAN
  808.         #if dstIs32ARGB
  809.             #define cnv32SPFto32DPF(a)        SwapU32(a)
  810.         #elif dstIs32BGRA
  811.             #define cnv32SPFto32DPF(a)        
  812.         #elif dstIs32ABGR
  813.             #define cnv32SPFto32DPF(a)        from32wxyzto32xyzw(a)
  814.         #elif dstIs32RGBA
  815.             #define cnv32SPFto32DPF(a)        from32wxyzto32wzyx(a)
  816.         #else
  817.             #if TempAllowDebugCalls
  818.                 #define cnv32SPFto32DPF(a)    DebugStr("\pcnv32SPFto32DPF")
  819.             #else
  820.                 #error "cnv32SPFto32DPF(a) not defined for this case in BltMacros.h";
  821.             #endif
  822.         #endif
  823.     #else            // TARGET_RT_BIG_ENDIAN
  824.         #if dstIs32ARGB
  825.             #define cnv32SPFto32DPF(a)        SwapU32(a)
  826.         #elif dstIs32BGRA
  827.             #define cnv32SPFto32DPF(a)        
  828.         #elif dstIs32ABGR
  829.             #define cnv32SPFto32DPF(a)        from32wxyzto32zwxy(a)
  830.         #elif dstIs32RGBA
  831.             #define cnv32SPFto32DPF(a)        from32wxyzto32yxwz(a)
  832.         #else
  833.             #if TempAllowDebugCalls
  834.                 #define cnv32SPFto32DPF(a)    DebugStr("\pcnv32SPFto32DPF")
  835.             #else
  836.                 #error "cnv32SPFto32DPF(a) not defined for this case in BltMacros.h";
  837.             #endif
  838.         #endif
  839.     #endif
  840. #elif srcIs32ABGR
  841.     #if TARGET_RT_LITTLE_ENDIAN
  842.         #if dstIs32ARGB
  843.             #define cnv32SPFto32DPF(a)        from32wxyzto32yxwz(a)
  844.         #elif dstIs32BGRA
  845.             #define cnv32SPFto32DPF(a)        from32wxyzto32zwxy(a)
  846.         #elif dstIs32ABGR
  847.             #define cnv32SPFto32DPF(a)        
  848.         #elif dstIs32RGBA
  849.             #define cnv32SPFto32DPF(a)        SwapU32(a)
  850.         #else
  851.             #if TempAllowDebugCalls
  852.                 #define cnv32SPFto32DPF(a)    DebugStr("\pcnv32SPFto32DPF")
  853.             #else
  854.                 #error "cnv32SPFto32DPF(a) not defined for this case in BltMacros.h";
  855.             #endif
  856.         #endif
  857.     #else        // TARGET_RT_BIG_ENDIAN
  858.         #if dstIs32ARGB
  859.             #define cnv32SPFto32DPF(a)        from32wxyzto32wzyx(a)
  860.         #elif dstIs32BGRA
  861.             #define cnv32SPFto32DPF(a)        from32wxyzto32xyzw(a)
  862.         #elif dstIs32ABGR
  863.             #define cnv32SPFto32DPF(a)        
  864.         #elif dstIs32RGBA
  865.             #define cnv32SPFto32DPF(a)        SwapU32(a)
  866.         #else
  867.             #if TempAllowDebugCalls
  868.                 #define cnv32SPFto32DPF(a)    DebugStr("\pcnv32SPFto32DPF")
  869.             #else
  870.                 #error "cnv32SPFto32DPF(a) not defined for this case in BltMacros.h";
  871.             #endif
  872.         #endif
  873.     #endif
  874. #elif srcIs32RGBA
  875.     #if TARGET_RT_LITTLE_ENDIAN
  876.         #if dstIs32ARGB
  877.             #define cnv32SPFto32DPF(a)        from32wxyzto32xyzw(a)
  878.         #elif dstIs32BGRA
  879.             #define cnv32SPFto32DPF(a)        from32wxyzto32wzyx(a)
  880.         #elif dstIs32ABGR
  881.             #define cnv32SPFto32DPF(a)        SwapU32(a)
  882.         #elif dstIs32RGBA
  883.             #define cnv32SPFto32DPF(a)        
  884.         #else
  885.             #if TempAllowDebugCalls
  886.                 #define cnv32SPFto32DPF(a)    DebugStr("\pcnv32SPFto32DPF")
  887.             #else
  888.                 #error "cnv32SPFto32DPF(a) not defined for this case in BltMacros.h";
  889.             #endif
  890.         #endif
  891.     #else            //  TARGET_RT_BIG_ENDIAN
  892.         #if dstIs32ARGB
  893.             #define cnv32SPFto32DPF(a)        from32wxyzto32zwxy(a)
  894.         #elif dstIs32BGRA
  895.             #define cnv32SPFto32DPF(a)        from32wxyzto32yxwz(a)
  896.         #elif dstIs32ABGR
  897.             #define cnv32SPFto32DPF(a)        SwapU32(a)
  898.         #elif dstIs32RGBA
  899.             #define cnv32SPFto32DPF(a)        
  900.         #else
  901.             #if TempAllowDebugCalls
  902.                 #define cnv32SPFto32DPF(a)    DebugStr("\pcnv32SPFto32DPF")
  903.             #else
  904.                 #error "cnv32SPFto32DPF(a) not defined for this case in BltMacros.h";
  905.             #endif
  906.         #endif
  907.     #endif
  908. #else
  909.     #if TempAllowDebugCalls
  910.         #define cnv32SPFto32DPF(a)    DebugStr("\pcnv32SPFto32DPF")
  911.     #else
  912.         #error "cnv32SPFto32DPF(a) not defined for this case in BltMacros.h";
  913.     #endif
  914. #endif
  915.  
  916. #undef T32SPFto32DPF
  917. #if ( ( dstIs32ARGB || dstIs32BGRA || dstIs32ABGR || dstIs32RGBA ) && ( srcIs32ARGB || srcIs32BGRA || srcIs32ABGR || srcIs32RGBA ))
  918. #define T32SPFto32DPF(src,dst) { unsigned long temp = GetU32(src); cnv32SPFto32DPF(temp); Set32(dst,temp); }
  919. #else
  920.     #if TempAllowDebugCalls
  921.         #define T32SPFto32DPF(src,dst) { DebugStr("\pT32SPFto32DPF"); }
  922.     #else
  923.         #error "T32SPFto32DPF(src,dst) not defined for this case in BltMacros.h";
  924.     #endif
  925. #endif
  926.  
  927. // converts 16 src pixel format to 16 dst pixel format, assumes src and dst will be read and written using Get16 and Set16
  928. #undef cnv16SPFto16DPF
  929. #undef cnv16SPFequals16DPF
  930. #if srcIs16BE555
  931.     #if dstIs16BE555
  932.         #define cnv16SPFto16DPF(a)
  933.         #define cnv16SPFequals16DPF 1
  934.     #elif dstIs16LE555
  935.         #define cnv16SPFto16DPF(a)        SwapU16(a)
  936.     #elif dstIs16LE565
  937.         #define cnv16SPFto16DPF(a)        a = ((((a)&0x007f)<<9) | (((a)&0x3f00)>>8) | (((unsigned short)(a)&0xe000)>>7))
  938.     #else
  939.         #if TempAllowDebugCalls
  940.             #define cnv16SPFto16DPF(a)    DebugStr("\pcnv16SPFto16DPF")
  941.         #else
  942.             #error "cnv16SPFto16DPF(a) not defined for this case in BltMacros.h";
  943.         #endif
  944.     #endif
  945. #elif srcIs16LE555 && TARGET_RT_LITTLE_ENDIAN
  946.     #if dstIs16BE555
  947.         #define cnv16SPFto16DPF(a)        SwapU16(a)
  948.     #elif dstIs16LE555
  949.         #define cnv16SPFto16DPF(a)        
  950.         #define cnv16SPFequals16DPF 1
  951.     #elif dstIs16LE565
  952.         #define cnv16SPFto16DPF(a)        a = ((((a)&0x7fe0)<<1) | ((((unsigned short)(a))&0x003f)) )
  953.     #else
  954.         #if TempAllowDebugCalls
  955.             #define cnv16SPFto16DPF(a)    DebugStr("\pcnv16SPFto16DPF")
  956.         #else
  957.             #error "cnv16SPFto16DPF(a) not defined for this case in BltMacros.h";
  958.         #endif
  959.     #endif
  960. #elif srcIs16LE565 && TARGET_RT_LITTLE_ENDIAN
  961.     #if dstIs16BE555
  962.         #define cnv16SPFto16DPF(a)        a = ((((a)&0xff00)>>9) | (((a)&0x01e0)<<7) | ((((unsigned short)(a))&0x001f)<<8) )
  963.     #elif dstIs16LE555
  964.         #define cnv16SPFto16DPF(a)        a = ((((a)&0xffe0)>>1) | ((((unsigned short)(a))&0x001f)) )
  965.     #elif dstIs16LE565
  966.         #define cnv16SPFto16DPF(a)        
  967.         #define cnv16SPFequals16DPF 1
  968.     #else
  969.         #if TempAllowDebugCalls
  970.             #define cnv16SPFto16DPF(a)    DebugStr("\pcnv16SPFto16DPF")
  971.         #else
  972.             #error "cnv16SPFto16DPF(a) not defined for this case in BltMacros.h";
  973.         #endif
  974.     #endif
  975. #else
  976.     #if TempAllowDebugCalls
  977.         #define cnv16SPFto16DPF(a)    DebugStr("\pcnv16SPFto16DPF")
  978.     #else
  979.         #error "cnv16SPFto16DPF(a) not defined for this case in BltMacros.h";
  980.     #endif
  981. #endif
  982.  
  983. // converts 16x2 src pixel format to 16x2 dst pixel format, assumes src and dst will be read and written using Get32 and Set32
  984. #undef cnv16SPFx2to16DPFx2
  985. #if srcIs16BE555
  986.     #if dstIs16BE555
  987.         #define cnv16SPFx2to16DPFx2(a)
  988.     #elif dstIs16LE555
  989.         #define cnv16SPFx2to16DPFx2(a)        from32wxyzto32xwzy(a)
  990.     #elif dstIs16LE565
  991.         #define cnv16SPFx2to16DPFx2(a)        a = ((((a)&0x007f007f)<<9) | (((a)&0x3f003f00)>>8) | ((((unsigned long)(a))&0xe000e000)>>7))
  992.     #else
  993.         #if TempAllowDebugCalls
  994.             #define cnv16SPFx2to16DPFx2(a)    DebugStr("\pcnv16SPFx2to16DPFx2")
  995.             
  996.             #error "cnv16SPFx2to16DPFx2(a) not defined for this case in BltMacros.h";
  997.         #endif
  998.     #endif
  999. #elif srcIs16LE555 && TARGET_RT_LITTLE_ENDIAN
  1000.     #if dstIs16BE555
  1001.         #define cnv16SPFx2to16DPFx2(a)        from32wxyzto32xwzy(a)
  1002.     #elif dstIs16LE555
  1003.         #define cnv16SPFx2to16DPFx2(a)        
  1004.     #elif dstIs16LE565
  1005.         #define cnv16SPFx2to16DPFx2(a)        a = ((((a)&0x7f007f00)>>7) | (((a)&0x003f003f)<<8) | ((((unsigned long)(a))&0x06000600)<<9))
  1006.     #else
  1007.         #if TempAllowDebugCalls
  1008.             #define cnv16SPFx2to16DPFx2(a)    DebugStr("\pcnv16SPFx2to16DPFx2")
  1009.         #else
  1010.             #error "cnv16SPFx2to16DPFx2(a) not defined for this case in BltMacros.h";
  1011.         #endif
  1012.     #endif
  1013. #elif srcIs16LE565 && TARGET_RT_LITTLE_ENDIAN
  1014.     #if dstIs16BE555
  1015.         #define cnv16SPFx2to16DPFx2(a)        a = ((((a)&0xfe00fe00)>>9) | (((a)&0x001f001f)<<8) | ((((unsigned long)(a))&0x01c001c0)<<7))
  1016.     #elif dstIs16LE555
  1017.         #define cnv16SPFx2to16DPFx2(a)        a = ((((a)&0xffc0ffc0)>>1) | ((((unsigned long)(a))&0x001f001f)))
  1018.     #elif dstIs16LE565
  1019.         #define cnv16SPFx2to16DPFx2(a)        
  1020.     #else
  1021.         #if TempAllowDebugCalls
  1022.             #define cnv16SPFx2to16DPFx2(a)    DebugStr("\pcnv16SPFx2to16DPFx2")
  1023.         #else
  1024.             #error "cnv16SPFx2to16DPFx2(a) not defined for this case in BltMacros.h";
  1025.         #endif
  1026.     #endif
  1027. #else
  1028.     #if TempAllowDebugCalls
  1029.         #define cnv16SPFx2to16DPFx2(a)    DebugStr("\pcnv16SPFx2to16DPFx2")
  1030.     #else
  1031.         #error "cnv16SPFx2to16DPFx2(a) not defined for this case in BltMacros.h";
  1032.     #endif
  1033. #endif
  1034.  
  1035. #undef cnv16SPFto16RG
  1036. #if srcIs16BE555
  1037. #define cnv16SPFto16RG(a)    B2NEndianU16(a)
  1038. #elif srcIs16LE555
  1039. #define cnv16SPFto16RG(a)    L2NEndianU16(a)    
  1040. #elif srcIs16LE565 & TARGET_RT_LITTLE_ENDIAN                //            r+g1+g2                                g2n+b
  1041. #define cnv16SPFto16RG(a)    a = ((((a)&0xffc0)>>1) | ((((unsigned short)(a))&0x001f)) )
  1042. #else
  1043.     #if TempAllowDebugCalls
  1044.         #define cnv16SPFto16RG(a)    DebugStr("\pcnv16SPFto16RG")
  1045.     #else
  1046.         #error "cnv16SPFto16RG(a) not defined for this case in BltMacros.h";
  1047.     #endif
  1048. #endif
  1049.  
  1050.  
  1051. #undef cnv16RGx2to16DPFx2
  1052. #if dstIs16BE555
  1053. #define cnv16RGx2to16DPFx2(a)        N2BEndianU32(a)
  1054. #elif dstIs16LE555 & TARGET_RT_LITTLE_ENDIAN
  1055. #define cnv16RGx2to16DPFx2(a)        from32wxyzto32yzwx(a)
  1056. #elif dstIs16LE555 & !TARGET_RT_LITTLE_ENDIAN
  1057.     #if TempAllowDebugCalls
  1058.         #define cnv16RGx2to16DPFx2(a)        DebugStr("\pcnv16RGx2to16DPFx2")
  1059.     #else
  1060.         #error "cnv16RGx2to16DPFx2(a) not defined for this case in BltMacros.h";
  1061.     #endif
  1062. #elif dstIs16LE565                    //            r+g1+g2                    g2n+b                            r2+g3+g4                    g4n+b2                                    g2                                    
  1063. #define cnv16RGx2to16DPFx2(a)        a = ((((a)&0x7fe00000)>>15) | (((a)&0x003f0000)>>16) | (((a)&0x00007fe0)<<17) | ((((unsigned long)(a))&0x0000003f)<<16))
  1064. #else
  1065.     #if TempAllowDebugCalls
  1066.         #define cnv16RGx2to16DPFx2(a)        DebugStr("\pcnv16RGx2to16DPFx2")
  1067.     #else
  1068.         #error "cnv16RGx2to16DPFx2(a) not defined for this case in BltMacros.h";
  1069.     #endif
  1070. #endif
  1071.  
  1072. #undef cnv32SPFto32AR
  1073. #if srcIs32ARGB
  1074. #define cnv32SPFto32AR(a)        N2BEndianU32(a)
  1075. #elif srcIs32BGRA
  1076. #define cnv32SPFto32AR(a)        N2LEndianU32(a)
  1077. #elif srcIs32ABGR && TARGET_RT_LITTLE_ENDIAN
  1078. #define cnv32SPFto32AR(a)        from32wxyzto32zwxy(a)
  1079. #elif srcIs32ABGR && !TARGET_RT_LITTLE_ENDIAN
  1080. #define cnv32SPFto32AR(a)        from32wxyzto32wzyx(a)
  1081. #elif srcIs32RGBA && TARGET_RT_LITTLE_ENDIAN
  1082. #define cnv32SPFto32AR(a)        from32wxyzto32wzyx(a)
  1083. #elif srcIs32RGBA && !TARGET_RT_LITTLE_ENDIAN
  1084. #define cnv32SPFto32AR(a)        from32wxyzto32zwxy(a)
  1085. #else
  1086.     #if TempAllowDebugCalls
  1087.         #define cnv32SPFto32AR(a)        DebugStr("\pcnv32SPFto32AR")
  1088.     #else
  1089.         #error "cnv32SPFto32AR(a) not defined for this case in BltMacros.h";
  1090.     #endif
  1091. #endif
  1092.  
  1093.  
  1094. // converts 24 bit src pixel format to 32 dst pixel format, assumes src and dst will be read and written using Get24 and Set32
  1095. #undef cnv24SPFto32DPF
  1096. #if srcIs24RGB
  1097.     #if dstIs32ARGB
  1098.         #define cnv24SPFto32DPF(a)        B2NEndianU32(a)
  1099.     #elif dstIs32BGRA
  1100.         #define cnv24SPFto32DPF(a)        L2NEndianU32(a)
  1101.     #elif dstIs32ABGR && TARGET_RT_LITTLE_ENDIAN
  1102.         #define cnv24SPFto32DPF(a)        from32wxyzto32xyzw(a)
  1103.     #elif dstIs32ABGR && !TARGET_RT_LITTLE_ENDIAN
  1104.         #define cnv24SPFto32DPF(a)        from32wxyzto32wzyx(a)
  1105.     #elif dstIs32RGBA && TARGET_RT_LITTLE_ENDIAN
  1106.         #define cnv24SPFto32DPF(a)        from32wxyzto32wzyx(a)
  1107.     #elif dstIs32RGBA && !TARGET_RT_LITTLE_ENDIAN
  1108.         #define cnv24SPFto32DPF(a)        from32wxyzto32xyzw(a)
  1109.     #else
  1110.         #if TempAllowDebugCalls
  1111.             #define cnv24SPFto32DPF(a)    DebugStr("\pcnv24SPFto32DPF")
  1112.         #else
  1113.             #error "cnv24SPFto32DPF(a) not defined for this case in BltMacros.h";
  1114.         #endif
  1115.     #endif
  1116. #elif srcIs24BGR
  1117.     #if dstIs32ARGB && TARGET_RT_LITTLE_ENDIAN
  1118.         #define cnv24SPFto32DPF(a)        from32wxyzto32xyzw(a)
  1119.     #elif dstIs32ARGB && !TARGET_RT_LITTLE_ENDIAN
  1120.         #define cnv24SPFto32DPF(a)        from32wxyzto32wzyx(a)
  1121.     #elif dstIs32BGRA && TARGET_RT_LITTLE_ENDIAN
  1122.         #define cnv24SPFto32DPF(a)        from32wxyzto32wzyx(a)        
  1123.     #elif dstIs32BGRA && !TARGET_RT_LITTLE_ENDIAN
  1124.         #define cnv24SPFto32DPF(a)        from32wxyzto32xyzw(a)        
  1125.     #elif dstIs32ABGR && TARGET_RT_LITTLE_ENDIAN
  1126.         #define cnv24SPFto32DPF(a)        from32wxyzto32zyxw(a)
  1127.     #elif dstIs32RGBA && TARGET_RT_LITTLE_ENDIAN
  1128.         #define cnv24SPFto32DPF(a)        
  1129.     #else
  1130.         #if TempAllowDebugCalls
  1131.             #define cnv24SPFto32DPF(a)    DebugStr("\pcnv24SPFto32DPF")
  1132.         #else
  1133.             #error "cnv24SPFto32DPF(a) not defined for this case in BltMacros.h";
  1134.         #endif
  1135.     #endif
  1136. #else
  1137.     #if TempAllowDebugCalls
  1138.         #define cnv24SPFto32DPF(a)    DebugStr("\pcnv24SPFto32DPF")
  1139.     #else
  1140.         #error "cnv24SPFto32DPF(a) not defined for this case in BltMacros.h";
  1141.     #endif
  1142. #endif
  1143.  
  1144.  
  1145. // converts 32 src pixel format to 24 dst pixel format, assumes src and dst will be read and written using Get32 and Set24
  1146. #undef cnv32SPFto24DPF
  1147. #if srcIs32ARGB
  1148.     #if dstIs24RGB && TARGET_RT_LITTLE_ENDIAN
  1149.         #define cnv32SPFto24DPF(a)        SwapU32(a)
  1150.     #elif dstIs24RGB && !TARGET_RT_LITTLE_ENDIAN
  1151.         #define cnv32SPFto24DPF(a)
  1152.     #elif dstIs24BGR
  1153.         #define cnv32SPFto24DPF(a)        from32wxyzto32zwxy(a)
  1154.     #else
  1155.         #if TempAllowDebugCalls
  1156.             #define cnv32SPFto24DPF(a)    DebugStr("\pcnv32SPFto24DPF")
  1157.         #else
  1158.             #error "cnv32SPFto24DPF(a) not defined for this case in BltMacros.h";
  1159.         #endif
  1160.     #endif
  1161. #elif srcIs32ARGB && !TARGET_RT_LITTLE_ENDIAN
  1162.     #if dstIs24RGB
  1163.         #define cnv32SPFto24DPF(a)
  1164.     #elif dstIs24BGR
  1165.         #define cnv32SPFto24DPF(a)        from32wxyzto32wzyx(a)
  1166.     #else
  1167.         #if TempAllowDebugCalls
  1168.             #define cnv32SPFto24DPF(a)    DebugStr("\pcnv32SPFto24DPF")
  1169.         #else
  1170.             #error "cnv32SPFto24DPF(a) not defined for this case in BltMacros.h";
  1171.         #endif
  1172.     #endif
  1173. #elif srcIs32BGRA  && !TARGET_RT_LITTLE_ENDIAN
  1174.     #if dstIs24RGB 
  1175.         #define cnv32SPFto24DPF(a)        SwapU32(a)
  1176.     #elif dstIs24BGR
  1177.         #define cnv32SPFto24DPF(a)        from32wxyzto32zwxy(a)
  1178.     #else
  1179.         #if TempAllowDebugCalls
  1180.             #define cnv32SPFto24DPF(a)    DebugStr("\pcnv32SPFto24DPF")
  1181.         #else
  1182.             #error "cnv32SPFto24DPF(a) not defined for this case in BltMacros.h";
  1183.         #endif
  1184.     #endif
  1185. #elif srcIs32BGRA && TARGET_RT_LITTLE_ENDIAN
  1186.     #if dstIs24RGB
  1187.         #define cnv32SPFto24DPF(a)
  1188.     #elif dstIs24BGR
  1189.         #define cnv32SPFto24DPF(a)        from32wxyzto32wzyx(a)
  1190.     #else
  1191.         #if TempAllowDebugCalls
  1192.             #define cnv32SPFto24DPF(a)    DebugStr("\pcnv32SPFto24DPF")
  1193.         #else
  1194.             #error "cnv32SPFto24DPF(a) not defined for this case in BltMacros.h";
  1195.         #endif
  1196.     #endif
  1197. #elif srcIs32ABGR && TARGET_RT_LITTLE_ENDIAN
  1198.     #if dstIs24RGB
  1199.         #define cnv32SPFto24DPF(a)        from32wxyzto32zwxy(a)
  1200.     #elif dstIs24BGR
  1201.         #define cnv32SPFto24DPF(a)        from32wxyzto32zyxw(a)
  1202.     #else
  1203.         #if TempAllowDebugCalls
  1204.             #define cnv32SPFto24DPF(a)    DebugStr("\pcnv32SPFto24DPF")
  1205.         #else
  1206.             #error "cnv32SPFto24DPF(a) not defined for this case in BltMacros.h";
  1207.         #endif
  1208.     #endif
  1209. #elif srcIs32ABGR && !TARGET_RT_LITTLE_ENDIAN
  1210.     #if dstIs24RGB
  1211.         #define cnv32SPFto24DPF(a)        from32wxyzto32wzyx(a)
  1212.     #elif dstIs24BGR
  1213.         #define cnv32SPFto24DPF(a)        
  1214.     #else
  1215.         #if TempAllowDebugCalls
  1216.             #define cnv32SPFto24DPF(a)    DebugStr("\pcnv32SPFto24DPF")
  1217.         #else
  1218.             #error "cnv32SPFto24DPF(a) not defined for this case in BltMacros.h";
  1219.         #endif
  1220.     #endif
  1221. #elif srcIs32RGBA && !TARGET_RT_LITTLE_ENDIAN
  1222.     #if dstIs24RGB
  1223.         #define cnv32SPFto24DPF(a)        from32wxyzto32zwxy(a)
  1224.     #elif dstIs24BGR
  1225.         #define cnv32SPFto24DPF(a)        from32wxyzto32zyxw(a)
  1226.     #else
  1227.         #if TempAllowDebugCalls
  1228.             #define cnv32SPFto24DPF(a)    DebugStr("\pcnv32SPFto24DPF")
  1229.         #else
  1230.             #error "cnv32SPFto24DPF(a) not defined for this case in BltMacros.h";
  1231.         #endif
  1232.     #endif
  1233. #elif srcIs32RGBA && TARGET_RT_LITTLE_ENDIAN
  1234.     #if dstIs24RGB
  1235.         #define cnv32SPFto24DPF(a)        from32wxyzto32wzyx(a)
  1236.     #elif dstIs24BGR
  1237.         #define cnv32SPFto24DPF(a)        
  1238.     #else
  1239.         #if TempAllowDebugCalls
  1240.             #define cnv32SPFto24DPF(a)    DebugStr("\pcnv32SPFto24DPF")
  1241.         #else
  1242.             #error "cnv32SPFto24DPF(a) not defined for this case in BltMacros.h";
  1243.         #endif
  1244.     #endif
  1245. #else
  1246.     #if TempAllowDebugCalls
  1247.         #define cnv32SPFto24DPF(a)    DebugStr("\pcnv32SPFto24DPF")
  1248.     #else
  1249.         #error "cnv32SPFto24DPF(a) not defined for this case in BltMacros.h";
  1250.     #endif
  1251. #endif
  1252.